package com.hb.C_Lambda表达式和集合.E_内联函数

/**
 * 返回值是调用apply方法的对象
 *
 * 1、apply函数使用的一般结构

    object.apply{
    //todo
    }
 *2、apply函数的inline+lambda结构
    @kotlin.internal.InlineOnly
    public inline fun <T> T.apply(block: T.() -> Unit): T { block(); return this }

 *3、apply函数的inline结构分析
 * 从结构上来看apply函数和run函数很像，唯一不同点就是它们各自返回的值不一样，
 * run函数是以闭包形式返回最后一行代码的值，而apply函数的返回的是传入对象的本身。
 *
 * 4、apply函数的适用场景
 * 整体作用功能和run函数很像，唯一不同点就是它返回的值是对象本身，
 * 而run函数是一个闭包形式返回，返回的是最后一行的值。
 * 正是基于这一点差异它的适用场景稍微与run函数有点不一样。
 * apply一般用于一个对象实例初始化的时候，需要对对象中的     属性进行赋值 。
 * 或者动态inflate出一个XML的View的时候需要给View绑定数据也会用到，
 * 这种情景非常常见。特别是在我们开发中会有一些数据model向View model转化实例化的过程中需要用到。
 *
        mSectionMetaData?.apply{
        //mSectionMetaData不为空的时候操作mSectionMetaData
        }?.questionnaire?.apply{

        //questionnaire不为空的时候操作questionnaire

        }?.section?.apply{

        //section不为空的时候操作section

        }?.sectionArticle?.apply{

        //sectionArticle不为空的时候操作sectionArticle

        }
 */
fun main() {
    val user = User("Kotlin", 1)

    val result = user.apply {
        println("my name is $name, I am $age years old")
        1000
    }
    println("result: $result")
}